/*
    作者：zx
    时间：2023.2.1
    描述：tty模块负责抽象硬件细节
*/

#include "ipc/semaphore.h"

#ifndef TTY_H
#define TTY_H

#define TTY_OUT_BUFF_SIZE 512
#define TTY_IN_BUFF_SIZE 512
#define TTY_TABLE_SIZE  8
// 回车换行转换
#define TTY_OUT_CRLF 1
#define TTY_IN_CRLF 1
// 是否回显
#define TTY_IN_ECHO (1<<2)

#define TTY_CMD_ECHO 0
#define TTY_CMD_ECHO_OPEN 1
#define TTY_CMD_ECHO_CLOSE 0

// 缓冲区，先进先出的队列
typedef struct _tty_fifo_t
{
    char * buff;
    int size;
    int read, write;
    int count;
}tty_fifo_t;

// tty设备。拥有输入/输出缓冲区
typedef struct _tty_t
{
    char out_buff[TTY_OUT_BUFF_SIZE],in_buff[TTY_IN_BUFF_SIZE];
    tty_fifo_t infifo,outfifo; 
    semaphore_t in_semaphore, out_semaphore;
    // 绑定的显示屏id,目前tty设备只用绑定显示屏
    int console_idx;
    // 是否将\n变成\r\n
    int out_flag, in_flag;
}tty_t;

int tty_fifo_put(tty_fifo_t * fifo, char ch);
int tty_fifo_get(tty_fifo_t * fifo, char * ch);
void tty_in(char ch);
void tty_select(int idx);
#endif // !TTY_H